{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "USAD_test.ipynb",
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "etniX_KTlJ5U"
      },
      "source": [
        "# USAD"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "N3jM0qLU8MgZ"
      },
      "source": [
        "## Environment"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rjheCL2b1Rnw"
      },
      "source": [
        "!rm -r sample_data"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "e3dDxs8LFZdT",
        "outputId": "ebff804d-1c59-4039-d869-f65907b19712",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 118
        }
      },
      "source": [
        "!git clone https://github.com/manigalati/usad"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Cloning into 'usad'...\n",
            "remote: Enumerating objects: 3, done.\u001b[K\n",
            "remote: Counting objects: 100% (3/3), done.\u001b[K\n",
            "remote: Compressing objects: 100% (3/3), done.\u001b[K\n",
            "remote: Total 66 (delta 0), reused 0 (delta 0), pack-reused 63\u001b[K\n",
            "Unpacking objects: 100% (66/66), done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "te9stFZtFfZu",
        "outputId": "3ca36b3b-dd9a-413c-873f-ab730285ad51",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "%cd usad"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/content/usad\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6u1DGKsAlLF-"
      },
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "\n",
        "from utils import *\n",
        "from usad import *"
      ],
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4AzWlDBI_djV",
        "outputId": "7a8d0c19-2389-461b-c0be-3427a25dda91",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "!nvidia-smi -L\n",
        "\n",
        "device = get_default_device()"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "GPU 0: Tesla T4 (UUID: GPU-8c7d4b22-c8a2-1d4d-9981-7f39110d869c)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1crx5rGP9ONf"
      },
      "source": [
        "## EDA - Data Pre-Processing"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vxofeE469RhT"
      },
      "source": [
        "### Download dataset"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "i95DlAZI1G_p",
        "outputId": "5b35771c-356e-4e0b-a997-682d1ea85c6a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 84
        }
      },
      "source": [
        "!mkdir input\n",
        "#normal period\n",
        "!python gdrivedl.py https://drive.google.com/open?id=1rVJ5ry5GG-ZZi5yI4x9lICB8VhErXwCw input/\n",
        "#anomalies\n",
        "!python gdrivedl.py https://drive.google.com/open?id=1iDYc0OEmidN712fquOBRFjln90SbpaE7 input/"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "input/SWaT_Dataset_Normal_v1.csv\n",
            "[==================================================] 163.77MB/163.77MB\n",
            "input/SWaT_Dataset_Attack_v0.csv\n",
            "[==================================================] 127.27MB/127.27MB\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kfSj4FYL9W8Y"
      },
      "source": [
        "### Normal period"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XeDLxV_r1G9n",
        "outputId": "576538dd-64f2-46fa-8e6f-6c2ffdebad15",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 87
        }
      },
      "source": [
        "#Read data\n",
        "normal = pd.read_csv(\"input/SWaT_Dataset_Normal_v1.csv\")#, nrows=1000)\n",
        "normal = normal.drop([\"Timestamp\" , \"Normal/Attack\" ] , axis = 1)\n",
        "normal.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (26) have mixed types.Specify dtype option on import or set low_memory=False.\n",
            "  interactivity=interactivity, compiler=compiler, result=result)\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(495000, 51)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fFuLm1GH1G2n"
      },
      "source": [
        "# Transform all columns into float64\n",
        "for i in list(normal): \n",
        "    normal[i]=normal[i].apply(lambda x: str(x).replace(\",\" , \".\"))\n",
        "normal = normal.astype(float)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zxFNH5kU9hIE"
      },
      "source": [
        "#### Normalization"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Mfxj4Uxn9kv4"
      },
      "source": [
        "from sklearn import preprocessing\n",
        "min_max_scaler = preprocessing.MinMaxScaler()\n",
        "\n",
        "x = normal.values\n",
        "x_scaled = min_max_scaler.fit_transform(x)\n",
        "normal = pd.DataFrame(x_scaled)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "mQ6_U4jn9nlw",
        "outputId": "f1cc1bd6-f1cc-4764-b1cc-2fd989ac4918",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 126
        }
      },
      "source": [
        "normal.head(2)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>10</th>\n",
              "      <th>11</th>\n",
              "      <th>12</th>\n",
              "      <th>13</th>\n",
              "      <th>14</th>\n",
              "      <th>15</th>\n",
              "      <th>16</th>\n",
              "      <th>17</th>\n",
              "      <th>18</th>\n",
              "      <th>19</th>\n",
              "      <th>20</th>\n",
              "      <th>21</th>\n",
              "      <th>22</th>\n",
              "      <th>23</th>\n",
              "      <th>24</th>\n",
              "      <th>25</th>\n",
              "      <th>26</th>\n",
              "      <th>27</th>\n",
              "      <th>28</th>\n",
              "      <th>29</th>\n",
              "      <th>30</th>\n",
              "      <th>31</th>\n",
              "      <th>32</th>\n",
              "      <th>33</th>\n",
              "      <th>34</th>\n",
              "      <th>35</th>\n",
              "      <th>36</th>\n",
              "      <th>37</th>\n",
              "      <th>38</th>\n",
              "      <th>39</th>\n",
              "      <th>40</th>\n",
              "      <th>41</th>\n",
              "      <th>42</th>\n",
              "      <th>43</th>\n",
              "      <th>44</th>\n",
              "      <th>45</th>\n",
              "      <th>46</th>\n",
              "      <th>47</th>\n",
              "      <th>48</th>\n",
              "      <th>49</th>\n",
              "      <th>50</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.0</td>\n",
              "      <td>0.005294</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.012291</td>\n",
              "      <td>0.075099</td>\n",
              "      <td>0.002009</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.121378</td>\n",
              "      <td>0.000109</td>\n",
              "      <td>0.006449</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.188674</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.003962</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.067998</td>\n",
              "      <td>0.435224</td>\n",
              "      <td>0.275616</td>\n",
              "      <td>0.527549</td>\n",
              "      <td>0.000146</td>\n",
              "      <td>0.000565</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.000814</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.001217</td>\n",
              "      <td>0.000147</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.0</td>\n",
              "      <td>0.005407</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.012291</td>\n",
              "      <td>0.075099</td>\n",
              "      <td>0.002009</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.121378</td>\n",
              "      <td>0.000109</td>\n",
              "      <td>0.006722</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.188674</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.004138</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.067998</td>\n",
              "      <td>0.435224</td>\n",
              "      <td>0.275616</td>\n",
              "      <td>0.527549</td>\n",
              "      <td>0.000146</td>\n",
              "      <td>0.000565</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.000814</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.001217</td>\n",
              "      <td>0.000147</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "    0         1    2    3    4   ...        46        47   48   49   50\n",
              "0  0.0  0.005294  0.5  0.0  0.0  ...  0.001217  0.000147  0.0  0.0  0.0\n",
              "1  0.0  0.005407  0.5  0.0  0.0  ...  0.001217  0.000147  0.0  0.0  0.0\n",
              "\n",
              "[2 rows x 51 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 17
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_i71RFAi9spa"
      },
      "source": [
        "### Attack"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "aN_TFp5x9uTE",
        "outputId": "38d7993d-c9a3-461d-c430-ebde697afbc6",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 87
        }
      },
      "source": [
        "#Read data\n",
        "attack = pd.read_csv(\"input/SWaT_Dataset_Attack_v0.csv\",sep=\";\")#, nrows=1000)\n",
        "attack = attack.drop([\"Timestamp\" , \"Normal/Attack\" ] , axis = 1)\n",
        "attack.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (1,9,28,46) have mixed types.Specify dtype option on import or set low_memory=False.\n",
            "  interactivity=interactivity, compiler=compiler, result=result)\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(449919, 51)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qLCInT-I9_-D"
      },
      "source": [
        "# Transform all columns into float64\n",
        "for i in list(attack):\n",
        "    attack[i]=attack[i].apply(lambda x: str(x).replace(\",\" , \".\"))\n",
        "attack = attack.astype(float)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c4cB4v3N-Dhu"
      },
      "source": [
        "#### Normalization"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jZrha9cO-BGK"
      },
      "source": [
        "from sklearn import preprocessing\n",
        "\n",
        "x = attack.values \n",
        "x_scaled = min_max_scaler.transform(x)\n",
        "attack = pd.DataFrame(x_scaled)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "z9SwiPco-BUa",
        "outputId": "f2507282-c0f9-4253-ece7-0a802b68240f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 126
        }
      },
      "source": [
        "attack.head(2)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>10</th>\n",
              "      <th>11</th>\n",
              "      <th>12</th>\n",
              "      <th>13</th>\n",
              "      <th>14</th>\n",
              "      <th>15</th>\n",
              "      <th>16</th>\n",
              "      <th>17</th>\n",
              "      <th>18</th>\n",
              "      <th>19</th>\n",
              "      <th>20</th>\n",
              "      <th>21</th>\n",
              "      <th>22</th>\n",
              "      <th>23</th>\n",
              "      <th>24</th>\n",
              "      <th>25</th>\n",
              "      <th>26</th>\n",
              "      <th>27</th>\n",
              "      <th>28</th>\n",
              "      <th>29</th>\n",
              "      <th>30</th>\n",
              "      <th>31</th>\n",
              "      <th>32</th>\n",
              "      <th>33</th>\n",
              "      <th>34</th>\n",
              "      <th>35</th>\n",
              "      <th>36</th>\n",
              "      <th>37</th>\n",
              "      <th>38</th>\n",
              "      <th>39</th>\n",
              "      <th>40</th>\n",
              "      <th>41</th>\n",
              "      <th>42</th>\n",
              "      <th>43</th>\n",
              "      <th>44</th>\n",
              "      <th>45</th>\n",
              "      <th>46</th>\n",
              "      <th>47</th>\n",
              "      <th>48</th>\n",
              "      <th>49</th>\n",
              "      <th>50</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.884144</td>\n",
              "      <td>0.577133</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.496158</td>\n",
              "      <td>0.188845</td>\n",
              "      <td>0.064088</td>\n",
              "      <td>0.982899</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.935973</td>\n",
              "      <td>0.935586</td>\n",
              "      <td>0.9336</td>\n",
              "      <td>0.5</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.999677</td>\n",
              "      <td>0.02816</td>\n",
              "      <td>0.980350</td>\n",
              "      <td>0.929175</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.909544</td>\n",
              "      <td>0.036437</td>\n",
              "      <td>0.398564</td>\n",
              "      <td>0.02134</td>\n",
              "      <td>0.980663</td>\n",
              "      <td>0.939499</td>\n",
              "      <td>0.962702</td>\n",
              "      <td>0.970903</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.946125</td>\n",
              "      <td>0.449782</td>\n",
              "      <td>0.944116</td>\n",
              "      <td>0.000073</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.891145</td>\n",
              "      <td>0.577190</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.496158</td>\n",
              "      <td>0.188845</td>\n",
              "      <td>0.064088</td>\n",
              "      <td>0.982899</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.935973</td>\n",
              "      <td>0.936183</td>\n",
              "      <td>0.9336</td>\n",
              "      <td>0.5</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.5</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.999677</td>\n",
              "      <td>0.02816</td>\n",
              "      <td>0.981743</td>\n",
              "      <td>0.929131</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.909544</td>\n",
              "      <td>0.036437</td>\n",
              "      <td>0.398564</td>\n",
              "      <td>0.02134</td>\n",
              "      <td>0.980663</td>\n",
              "      <td>0.952672</td>\n",
              "      <td>0.962702</td>\n",
              "      <td>0.970903</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.946125</td>\n",
              "      <td>0.449782</td>\n",
              "      <td>0.944521</td>\n",
              "      <td>0.000073</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "         0         1    2    3    4   ...        46        47   48   49   50\n",
              "0  0.884144  0.577133  1.0  1.0  0.0  ...  0.944116  0.000073  0.0  0.0  0.0\n",
              "1  0.891145  0.577190  1.0  1.0  0.0  ...  0.944521  0.000073  0.0  0.0  0.0\n",
              "\n",
              "[2 rows x 51 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 21
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xXJi503b-j_d"
      },
      "source": [
        "### Windows"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vyplttZa-BRN"
      },
      "source": [
        "window_size=12"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dzGJMp6Y-BN5",
        "outputId": "2949d278-1313-442c-f06b-275a8c6c6578",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "windows_normal=normal.values[np.arange(window_size)[None, :] + np.arange(normal.shape[0]-window_size)[:, None]]\n",
        "windows_normal.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(494988, 12, 51)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "17LdB3c8-pRH",
        "outputId": "721059d4-5937-4dd3-d73c-e5d255fc273c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "windows_attack=attack.values[np.arange(window_size)[None, :] + np.arange(attack.shape[0]-window_size)[:, None]]\n",
        "windows_attack.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(449907, 12, 51)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 24
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "k70ZFxGs-_7m"
      },
      "source": [
        "## Training"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yi9S0SGnDKNc"
      },
      "source": [
        "import torch.utils.data as data_utils\n",
        "\n",
        "BATCH_SIZE =  7919\n",
        "N_EPOCHS = 100\n",
        "hidden_size = 10\n",
        "\n",
        "w_size=windows_normal.shape[1]*windows_normal.shape[2]\n",
        "z_size=windows_normal.shape[1]*hidden_size\n",
        "\n",
        "windows_normal_train = windows_normal[:int(np.floor(.8 * .5 * windows_normal.shape[0]))]\n",
        "windows_normal_val = windows_normal[int(np.floor(.8 * .5 * windows_normal.shape[0])):int(np.floor(.5 * windows_normal.shape[0]))]\n",
        "windows_normal_test = windows_normal[int(np.floor(.5 * windows_normal.shape[0])):]\n",
        "\n",
        "train_loader = torch.utils.data.DataLoader(data_utils.TensorDataset(\n",
        "    torch.from_numpy(windows_normal_train).float().view(([windows_normal_train.shape[0],w_size]))\n",
        ") , batch_size=BATCH_SIZE, shuffle=False, num_workers=0)\n",
        "\n",
        "val_loader = torch.utils.data.DataLoader(data_utils.TensorDataset(\n",
        "    torch.from_numpy(windows_normal_val).float().view(([windows_normal_val.shape[0],w_size]))\n",
        ") , batch_size=BATCH_SIZE, shuffle=False, num_workers=0)\n",
        "\n",
        "test_loader = torch.utils.data.DataLoader(data_utils.TensorDataset(\n",
        "    torch.from_numpy(np.concatenate([windows_normal_test,windows_attack])).float().view(([windows_normal_test.shape[0]+windows_attack.shape[0],w_size]))\n",
        ") , batch_size=BATCH_SIZE, shuffle=False, num_workers=0)\n",
        "\n",
        "model = UsadModel(w_size, z_size)\n",
        "model = to_device(model,device)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "So9yjDPEDObC",
        "outputId": "629bcd13-37b1-4907-ef0d-46d9e3ad5398",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "history = training(N_EPOCHS,model,train_loader,val_loader)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch [0], val_loss1: 0.0647, val_loss2: 0.0686\n",
            "Epoch [1], val_loss1: 0.0395, val_loss2: -0.0014\n",
            "Epoch [2], val_loss1: 0.0331, val_loss2: -0.0130\n",
            "Epoch [3], val_loss1: 0.0356, val_loss2: -0.0201\n",
            "Epoch [4], val_loss1: 0.0362, val_loss2: -0.0236\n",
            "Epoch [5], val_loss1: 0.0360, val_loss2: -0.0255\n",
            "Epoch [6], val_loss1: 0.0347, val_loss2: -0.0263\n",
            "Epoch [7], val_loss1: 0.0325, val_loss2: -0.0254\n",
            "Epoch [8], val_loss1: 0.0332, val_loss2: -0.0270\n",
            "Epoch [9], val_loss1: 0.0351, val_loss2: -0.0292\n",
            "Epoch [10], val_loss1: 0.0339, val_loss2: -0.0287\n",
            "Epoch [11], val_loss1: 0.0323, val_loss2: -0.0276\n",
            "Epoch [12], val_loss1: 0.0182, val_loss2: -0.0156\n",
            "Epoch [13], val_loss1: 0.0174, val_loss2: -0.0150\n",
            "Epoch [14], val_loss1: 0.0164, val_loss2: -0.0144\n",
            "Epoch [15], val_loss1: 0.0179, val_loss2: -0.0158\n",
            "Epoch [16], val_loss1: 0.0183, val_loss2: -0.0164\n",
            "Epoch [17], val_loss1: 0.0174, val_loss2: -0.0158\n",
            "Epoch [18], val_loss1: 0.0131, val_loss2: -0.0118\n",
            "Epoch [19], val_loss1: 0.0128, val_loss2: -0.0115\n",
            "Epoch [20], val_loss1: 0.0127, val_loss2: -0.0115\n",
            "Epoch [21], val_loss1: 0.0129, val_loss2: -0.0117\n",
            "Epoch [22], val_loss1: 0.0131, val_loss2: -0.0120\n",
            "Epoch [23], val_loss1: 0.0130, val_loss2: -0.0119\n",
            "Epoch [24], val_loss1: 0.0131, val_loss2: -0.0121\n",
            "Epoch [25], val_loss1: 0.0128, val_loss2: -0.0119\n",
            "Epoch [26], val_loss1: 0.0111, val_loss2: -0.0102\n",
            "Epoch [27], val_loss1: 0.0139, val_loss2: -0.0130\n",
            "Epoch [28], val_loss1: 0.0124, val_loss2: -0.0116\n",
            "Epoch [29], val_loss1: 0.0124, val_loss2: -0.0116\n",
            "Epoch [30], val_loss1: 0.0126, val_loss2: -0.0118\n",
            "Epoch [31], val_loss1: 0.0122, val_loss2: -0.0115\n",
            "Epoch [32], val_loss1: 0.0120, val_loss2: -0.0113\n",
            "Epoch [33], val_loss1: 0.0116, val_loss2: -0.0110\n",
            "Epoch [34], val_loss1: 0.0121, val_loss2: -0.0114\n",
            "Epoch [35], val_loss1: 0.0118, val_loss2: -0.0112\n",
            "Epoch [36], val_loss1: 0.0119, val_loss2: -0.0113\n",
            "Epoch [37], val_loss1: 0.0112, val_loss2: -0.0107\n",
            "Epoch [38], val_loss1: 0.0098, val_loss2: -0.0093\n",
            "Epoch [39], val_loss1: 0.0094, val_loss2: -0.0089\n",
            "Epoch [40], val_loss1: 0.0092, val_loss2: -0.0087\n",
            "Epoch [41], val_loss1: 0.0094, val_loss2: -0.0090\n",
            "Epoch [42], val_loss1: 0.0090, val_loss2: -0.0086\n",
            "Epoch [43], val_loss1: 0.0090, val_loss2: -0.0086\n",
            "Epoch [44], val_loss1: 0.0088, val_loss2: -0.0085\n",
            "Epoch [45], val_loss1: 0.0122, val_loss2: -0.0117\n",
            "Epoch [46], val_loss1: 0.0113, val_loss2: -0.0109\n",
            "Epoch [47], val_loss1: 0.0114, val_loss2: -0.0110\n",
            "Epoch [48], val_loss1: 0.0103, val_loss2: -0.0099\n",
            "Epoch [49], val_loss1: 0.0092, val_loss2: -0.0089\n",
            "Epoch [50], val_loss1: 0.0088, val_loss2: -0.0085\n",
            "Epoch [51], val_loss1: 0.0084, val_loss2: -0.0081\n",
            "Epoch [52], val_loss1: 0.0077, val_loss2: -0.0075\n",
            "Epoch [53], val_loss1: 0.0080, val_loss2: -0.0077\n",
            "Epoch [54], val_loss1: 0.0097, val_loss2: -0.0094\n",
            "Epoch [55], val_loss1: 0.0102, val_loss2: -0.0099\n",
            "Epoch [56], val_loss1: 0.0073, val_loss2: -0.0071\n",
            "Epoch [57], val_loss1: 0.0072, val_loss2: -0.0070\n",
            "Epoch [58], val_loss1: 0.0090, val_loss2: -0.0088\n",
            "Epoch [59], val_loss1: 0.0084, val_loss2: -0.0082\n",
            "Epoch [60], val_loss1: 0.0078, val_loss2: -0.0076\n",
            "Epoch [61], val_loss1: 0.0064, val_loss2: -0.0062\n",
            "Epoch [62], val_loss1: 0.0059, val_loss2: -0.0057\n",
            "Epoch [63], val_loss1: 0.0061, val_loss2: -0.0059\n",
            "Epoch [64], val_loss1: 0.0058, val_loss2: -0.0056\n",
            "Epoch [65], val_loss1: 0.0057, val_loss2: -0.0055\n",
            "Epoch [66], val_loss1: 0.0058, val_loss2: -0.0057\n",
            "Epoch [67], val_loss1: 0.0060, val_loss2: -0.0058\n",
            "Epoch [68], val_loss1: 0.0057, val_loss2: -0.0056\n",
            "Epoch [69], val_loss1: 0.0054, val_loss2: -0.0052\n",
            "Epoch [70], val_loss1: 0.0059, val_loss2: -0.0057\n",
            "Epoch [71], val_loss1: 0.0061, val_loss2: -0.0060\n",
            "Epoch [72], val_loss1: 0.0057, val_loss2: -0.0056\n",
            "Epoch [73], val_loss1: 0.0053, val_loss2: -0.0052\n",
            "Epoch [74], val_loss1: 0.0056, val_loss2: -0.0054\n",
            "Epoch [75], val_loss1: 0.0058, val_loss2: -0.0057\n",
            "Epoch [76], val_loss1: 0.0061, val_loss2: -0.0059\n",
            "Epoch [77], val_loss1: 0.0061, val_loss2: -0.0060\n",
            "Epoch [78], val_loss1: 0.0069, val_loss2: -0.0067\n",
            "Epoch [79], val_loss1: 0.0059, val_loss2: -0.0058\n",
            "Epoch [80], val_loss1: 0.0055, val_loss2: -0.0054\n",
            "Epoch [81], val_loss1: 0.0051, val_loss2: -0.0050\n",
            "Epoch [82], val_loss1: 0.0062, val_loss2: -0.0060\n",
            "Epoch [83], val_loss1: 0.0060, val_loss2: -0.0059\n",
            "Epoch [84], val_loss1: 0.0053, val_loss2: -0.0052\n",
            "Epoch [85], val_loss1: 0.0055, val_loss2: -0.0053\n",
            "Epoch [86], val_loss1: 0.0062, val_loss2: -0.0061\n",
            "Epoch [87], val_loss1: 0.0063, val_loss2: -0.0062\n",
            "Epoch [88], val_loss1: 0.0052, val_loss2: -0.0051\n",
            "Epoch [89], val_loss1: 0.0046, val_loss2: -0.0045\n",
            "Epoch [90], val_loss1: 0.0053, val_loss2: -0.0052\n",
            "Epoch [91], val_loss1: 0.0062, val_loss2: -0.0060\n",
            "Epoch [92], val_loss1: 0.0057, val_loss2: -0.0056\n",
            "Epoch [93], val_loss1: 0.0055, val_loss2: -0.0054\n",
            "Epoch [94], val_loss1: 0.0058, val_loss2: -0.0057\n",
            "Epoch [95], val_loss1: 0.0041, val_loss2: -0.0040\n",
            "Epoch [96], val_loss1: 0.0042, val_loss2: -0.0042\n",
            "Epoch [97], val_loss1: 0.0051, val_loss2: -0.0050\n",
            "Epoch [98], val_loss1: 0.0046, val_loss2: -0.0045\n",
            "Epoch [99], val_loss1: 0.0043, val_loss2: -0.0043\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fYwlN0JKVVtN",
        "outputId": "c742ff8b-3b4a-41f5-dd09-effee1be928a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 295
        }
      },
      "source": [
        "plot_history(history)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ieObNqKYsOzh"
      },
      "source": [
        "torch.save({\n",
        "            'encoder': model.encoder.state_dict(),\n",
        "            'decoder1': model.decoder1.state_dict(),\n",
        "            'decoder2': model.decoder2.state_dict()\n",
        "            }, \"model.pth\")"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ymhjbmvR_DgJ"
      },
      "source": [
        "## Testing"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "b7rbm9wdXKeF",
        "outputId": "076309c7-22be-41f6-f916-5f11cb679672",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "checkpoint = torch.load(\"model.pth\")\n",
        "\n",
        "model.encoder.load_state_dict(checkpoint['encoder'])\n",
        "model.decoder1.load_state_dict(checkpoint['decoder1'])\n",
        "model.decoder2.load_state_dict(checkpoint['decoder2'])"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<All keys matched successfully>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 27
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ry1QTp6V2ny4"
      },
      "source": [
        "results=testing(model,test_loader)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FSWwxheNvxR7"
      },
      "source": [
        "y_pred=np.concatenate([torch.stack(results[:-1]).flatten().detach().cpu().numpy(),\n",
        "                              results[-1].flatten().detach().cpu().numpy()])\n",
        "y_test=np.concatenate([np.zeros(windows_normal_test.shape[0]),\n",
        "                       np.ones(windows_attack.shape[0])])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S6R9tL9PJc9A",
        "outputId": "ef92dc99-7990-46d3-b049-70ef9f10f738",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 395
        }
      },
      "source": [
        "histogram(y_test,y_pred)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 864x432 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bROUyLM93cG3",
        "outputId": "755359d9-d0fb-4deb-b313-d3c2a2465a26",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        }
      },
      "source": [
        "threshold=ROC(y_test,y_pred)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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Ky1atDgu5tOmqhH1c84552hdPP2/m7Tb1Le1oLCkTvePVB999JHXIYRdfbR53bp1px9IPRg/fryef/75eu+996qq07bvf//7x+1z00036YsvvqiqqlOnTtUbb7xRCwsLVVV1165d+uqrr9bouZ588km95ZZbVFV11qxZOn78+O/ss2bNGk1NTdUjR45oSUmJjhgxQr/++mtVVc3Pzy/fb+bMmeWPtXv3bv3iiy/07rvv1kceeaR8n9LSUj18+LCqqhYXF+ugQYN08eLF5W16/fXXv/P8ldt/6NChKtsRCAQ0KSlJc3Jyyq/bunWrXnLJJdq1a1fdu3dvtXHt2LFDly9fXv4cvXv31rVr16qq6pQpU3TGjBmqqjpjxgy98847VVV1+vTp5Zf37NmjrVu31qKiIi0qKip/Lw4fPqzdunXT7du3V7xeu3Zp6YoVOvbqq3XWrFmqqrpw4UItKXE+p+68887yxy2L55prrtFx48YdF/OJqvr7BZbpST5XbYzAmFO4/621rNtxqF4fs1+nBKZdmVrtPgUFBXz66ad89NFHXHnlldx///3V7n/06FH++te/8u2339KsWTMAkpKSGD9+fI1imjt3LveFTr4ybtw4Jk+ejKoed8x5/fr1DB48mObNmwNw0UUX8c9//pM777yThISE8v2OHDlSfr/27dvTvn173nnnneOeT0Ro0aIF4PRkSkpK6mVc5oMPPqBnz55069at/LrbbruNhx9+mDFjxpRfd7K4OnbsSMeOHQGIj4+nb9++bN++nX79+jF37lyys7MBuOmmm8jKyuKhhx5CRDh8+DCqSkFBAW3atCE6OpomlaaMFhUVUVpaWr6dkJAACQkEWrakuKTEOVqxaxeXXHyxM4YADBkyhDcq1TJ6++236d69O3H1XALbd4eGjIkUc+fOZdSoUfTp04fExESWL19e7f6bNm2ia9eux30gV/aDH/zguMMnZT8vvvgiANu3b6dL6OTt0dHRtGzZkry8vOMeo3///nzyySfk5eVx9OhR5s+fz7ZKi6buueceunTpwssvv1x+2KY6wWCQjIwM2rdvz8iRIxk8ePBxjzVgwABuu+02iiqdGGbx4sWkp6czduxY1q5d+53HnD17Ntdff3359ty5c+ncuTPp6emnjOdEOTk5rFixojyu3bt3lyeJDh06sHv3bgAmT57M+vXr6dSp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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8CbQmMjCIl1_",
        "outputId": "25c93a9e-9c5d-449e-8b77-2cc906b269f0",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        }
      },
      "source": [
        "confusion_matrix(y_test,np.where(y_pred > threshold, 1, 0),perc=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    }
  ]
}